package pub.wkq.api.retry;

import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import pub.wkq.common.exception.CustomException;
import pub.wkq.common.result.ResponseStatusEnum;
import pub.wkq.common.utils.SMSUtils;
import pub.wkq.common.utils.SMSUtilsRetry;

import java.time.LocalDateTime;

/**
 * 重试组件
 */
@Component
@Slf4j
public class RetryComponent {
    @Retryable(value = {IllegalArgumentException.class}//指定重试的异常，不是这个则不重试
            ,maxAttempts = 5//最大重试次数
            ,backoff = @Backoff(delay = 1000L,multiplier = 2)//重试间隔时间,重试间隔为 1 秒，后续的重试为次数的 2，1/2/4/8
            )
    public boolean sendSmsWithRetry(){
        log.info("当前时间 Time = {}", LocalDateTime.now());
        return SMSUtilsRetry.sendSms();
    }
    /**
     * 达到最大重试次数，或者抛出一个没有被设置（进行重试）的异常
     * 可以作为方法的最终兜底处理，如果不处理，也可以
     * @return
     */
    @Recover
    public boolean recover() {
        CustomException.thr(ResponseStatusEnum.SYSTEM_SMS_FALLBACK_ERROR);
        return false;
    }
}
